home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / LANG / PROLOG / HUMBOLT / HUMBOLTS / _files / _humboltsr / WRITE._c < prev   
Text File  |  1990-06-26  |  11KB  |  406 lines

  1. /***************************************************
  2. ****************************************************
  3. **                                                **
  4. **  HU-Prolog     Portable Interpreter System     **
  5. **                                                **
  6. **  Release 1.62   January  1990                  **
  7. **                                                **
  8. **  Authors:      C.Horn, M.Dziadzka, M.Horn      **
  9. **                                                **
  10. **  (C) 1989      Humboldt-University             **
  11. **                Department of Mathematics       **
  12. **                GDR 1086 Berlin, P.O.Box 1297   **
  13. **                                                **
  14. ****************************************************
  15. ***************************************************/
  16.  
  17. #include "systems.h"
  18. #include "types.h"
  19. #include "errors.h"
  20. #include "atoms.h"
  21. #include "files.h"
  22. #include "maxvars.h"
  23.  
  24. /*
  25. WriteOut writes a term to the text file 'output', using operator
  26. information in atom entries to select the best syntax.  
  27. */
  28.  
  29. IMPORT boolean TRACING,SPYTRACE;
  30. IMPORT int SPYING;
  31. IMPORT ENV E;
  32. IMPORT PREC LPREC(),RPREC();
  33. IMPORT void ABORT(),SYSTEMERROR(); 
  34. IMPORT void GETCHAR(); 
  35. IMPORT char CH; 
  36. IMPORT TERM phy_name();
  37. IMPORT boolean FILEENDED();
  38. IMPORT file OpenFile();
  39. IMPORT boolean UserAbort,ENAB_INTR;
  40.  
  41.  
  42. #if !BIT8
  43. #define WRITEDEPTH 200   /* Max. nesting depth */
  44. #endif
  45. #if BIT8
  46. #define WRITEDEPTH 20   /* Max. nesting depth */
  47. #endif
  48.  
  49. #define WRITELENGTH 512   /* Max. list length */
  50.  
  51. FORWARD void wq();
  52.  
  53. IMPORT TERM VAR_TAB[MAXVARS]; /* use vartable from read.c */
  54.  
  55. LOCAL int  VARCNT;
  56. LOCAL boolean LISTFLAG,DISPLFLAG,QUOTE;
  57.  
  58. IMPORT char CHARCLASS[]; /* from readin.c */
  59.  
  60. #define SC 1
  61. #define BC 2
  62. #define DC 3
  63. #define OC 4
  64. #define C0 5
  65.  
  66. LOCAL boolean last_was_numb;
  67.  
  68. LOCAL void WRITETERM (TERM Y, PREC P, int DEPTH)
  69.     ATOM A;
  70.     last_was_numb=false;
  71.     if(UserAbort && ENAB_INTR) return;
  72.     if(DEPTH <=0)  { ws("___"); return; }
  73.     /* if(!LISTFLAG) deref(Y); */
  74.     if(!LISTFLAG || name(Y)==VART) deref(Y);
  75.     switch (A=name(Y))
  76.     {
  77.     case INTT: wi(ival(Y)); last_was_numb=true; break;
  78. #if LONGARITH
  79.     case LONGT: ws(ltoa(longval(Y))); last_was_numb=true; break;
  80. #endif
  81. #if REALARITH
  82.     case REALT: ws(ftoa(realval(Y))); last_was_numb=true; break;
  83. #endif
  84.     case UNBOUNDT:
  85.       if(is_heapterm(Y))
  86.       ws("_");
  87.       else
  88.       {
  89.           int D;
  90.           ws("_");
  91.           D=0;
  92.           while(D!=VARCNT)
  93.               if(Y==VAR_TAB[D++]) { wi(D); return; }
  94.           if(VARCNT!=MAXVARS)
  95.               { VAR_TAB[VARCNT++]=Y; wi(VARCNT); }
  96.       }
  97.       break;
  98.  
  99.     case SKELT:
  100.       ws("_"); wi(offset(Y)); break;
  101.  
  102.     case CURLY_1:
  103.       ws("{"); WRITETERM(son(Y),MAXPREC,DEPTH-1); 
  104.       if(UserAbort && ENAB_INTR) return;
  105.       ws("}"); break;
  106.  
  107.     case CONS_2:
  108.       if(!DISPLFLAG)
  109.         { int  N;
  110.           TERM  Z,ZZ;
  111.           boolean asciistring=true;
  112.           Z=Y; N=0;
  113.           do { N++;
  114.                if(LISTFLAG) ZZ=son(Z); else ZZ=arg1(Z);
  115.                if(name(ZZ)!=INTT || ival(ZZ)<' ' || 127<=ival(ZZ)) 
  116.                asciistring=false; 
  117.                if(LISTFLAG) Z=br(son(Z)); else Z=arg2(Z);
  118.           } while(name(Z)==CONS_2 && N < WRITELENGTH); 
  119.           if(N >=WRITELENGTH)goto listnotation;
  120.           if(name(Z)!=NIL_0) 
  121.           { asciistring=false;
  122.             if(name(Z)!=UNBOUNDT && name(Z)!=SKELT) goto operator;  
  123.             /* operator representation  a.b.c  for 
  124.                not well founded lists */
  125.           }
  126.           if(asciistring && 0<N && N<60)
  127.           { ws("\""); 
  128.             Z=Y; 
  129.             do { if(LISTFLAG) ZZ=son(Z); else ZZ=arg1(Z);
  130.                  wc(ival(ZZ));
  131.                  if(LISTFLAG) Z=br(son(Z)); else Z=arg2(Z);
  132.             } while(name(Z)==CONS_2);
  133.             ws("\"");
  134.             break;
  135.           }
  136.         listnotation:
  137.           ws("[");
  138.           WRITETERM(son(Y),SUBPREC,DEPTH-1);
  139.           if(UserAbort && ENAB_INTR) return;
  140.           N=1;
  141.           if(LISTFLAG) Z=br(son(Y)); else Z=arg2(Y);
  142.           while(N++!=WRITELENGTH && name(Z)==CONS_2 )
  143.           { ws(", ");
  144.             WRITETERM(son(Z),SUBPREC,DEPTH-1);
  145.             if(UserAbort && ENAB_INTR) return;
  146.             if(LISTFLAG) Z=br(son(Z)); else Z=arg2(Z);
  147.           }
  148.           if(name(Z)!=NIL_0)
  149.           { if(N<WRITELENGTH) { ws(" | "); WRITETERM(Z,SUBPREC,DEPTH-1); }
  150.             else ws(" ...");
  151.           }
  152.           ws("]");
  153.           break;
  154.         }
  155.              
  156.  
  157.     default:
  158.  
  159.       if(arity(A)==0) 
  160.       {     if(A !=NIL_0 && A !=CURLY_0 && A !=CUT_0) wq(A); 
  161.             else ws(tempcopy(A));
  162.             break;
  163.       }
  164.  
  165.   
  166.       if(oclass(A)==NONO || arity(A)>2 || DISPLFLAG) 
  167.       /*------------------------------------*/
  168.       { int i,aar;
  169.         TERM  S;
  170.         wq(A);
  171.         ws("(");  
  172.         aar=arity(A);
  173.         S=son(Y);
  174.         for(i=1;i<=aar;i++)
  175.         {  WRITETERM(S,SUBPREC,DEPTH-1);
  176.             if(UserAbort && ENAB_INTR) return;
  177.            next_br(S);
  178.            if(i < aar) ws(",");
  179.         }
  180.         ws(")");  
  181.         break;
  182.       }
  183.       
  184.       /* operator notation */
  185.       /*-------------------*/
  186.       operator:
  187.       if(P<oprec(A)) ws("(");
  188.       switch (oclass(A)) 
  189.       { case FXO: case FYO:
  190.           wq(A); ws(" "); WRITETERM(son(Y),RPREC(A),DEPTH-1); break;
  191.         case XFO: case YFO:
  192.           WRITETERM(son(Y),LPREC(A),DEPTH-1); if(UserAbort && ENAB_INTR) return;
  193.           ws(" "); wq(A); break;
  194.         case XFXO: case XFYO: case YFXO:
  195.           WRITETERM(son(Y),LPREC(A),DEPTH-1);
  196.             if(UserAbort && ENAB_INTR) return;
  197.           if(A==CONS_2 && last_was_numb) ws(" ");
  198.           else if(A!=COMMA_2 && A!=SEMI_2 && A!=COLON_2) ws(" ");  
  199.           ws(tempcopy(A));
  200.           if(A!=CONS_2 && A!=NL_2) ws(" ");  
  201.           WRITETERM(br(son(Y)),RPREC(A),DEPTH-1);
  202.             if(UserAbort && ENAB_INTR) return;
  203.           break;
  204.        default: SYSTEMERROR("WRITETERM.1");
  205.       }
  206.       if(P<oprec(A)) ws(")");
  207.       break;
  208.  
  209.   }
  210. }
  211.  
  212. GLOBAL void DISPLAY(TERM T)
  213. { QUOTE=true; LISTFLAG=false; VARCNT=0; DISPLFLAG=true;
  214. #if !CPM
  215.   out_buffer(BUF_ON);
  216. #endif
  217.   WRITETERM(T,MAXPREC,WRITEDEPTH);
  218. #if !CPM
  219.   out_buffer(BUF_OFF);
  220. #endif
  221.   QUOTE=false;
  222. }
  223.  
  224. GLOBAL void WRITEOUT(TERM X, boolean quote)
  225. { QUOTE=quote; DISPLFLAG=false; LISTFLAG=false; 
  226.   VARCNT=0; 
  227. #if !CPM
  228. /*  out_buffer(BUF_ON); */
  229. #endif
  230.   WRITETERM(X,MAXPREC,WRITEDEPTH); 
  231. #if !CPM
  232. /*  out_buffer(BUF_OFF); */
  233. #endif
  234.   QUOTE=false;
  235. }
  236.  
  237. GLOBAL void ABORT_WRITE(register TERM T)
  238. {
  239.     QUOTE=false; DISPLFLAG=false; LISTFLAG=false; 
  240.     VARCNT=0; WRITETERM(T,MAXPREC,10); 
  241. }
  242.     
  243.  
  244. GLOBAL void LISTOUT (TERM X)
  245. { LISTFLAG=true; DISPLFLAG=false;
  246.   QUOTE=true; VARCNT=0; 
  247. #if !CPM
  248.   out_buffer(BUF_ON); 
  249. #endif
  250.   WRITETERM(X,SUBPREC,WRITEDEPTH); 
  251. #if !CPM
  252.   out_buffer(BUF_OFF); 
  253. #endif
  254.   QUOTE=false;
  255. }
  256.  
  257.  
  258. /* Output a trace message. */
  259.  
  260. GLOBAL ENV TRACE_GOON=0;
  261.  
  262. GLOBAL boolean TRACE(ATOM MESS, TERM Y, ENV ENVP)
  263. { boolean spyflag=false, answer=true;
  264.   boolean mustread=true;
  265.   boolean again=false;
  266.   TERM oldinfile,oldoutfile;
  267.   boolean newgo=false;
  268.  
  269.   E=ENVP; BE=base(ENVP);
  270.   if(TRACE_GOON && E>TRACE_GOON) return true;
  271.   if(TRACE_GOON && E==TRACE_GOON && MESS==REDO_0) return true;
  272.   deref(Y);
  273. #if  DEBUG
  274.   if(DEBUGFLAG) out_1(itoa(Y));
  275.   else 
  276. #endif
  277.   if(name(Y)==COMMA_2 || name(Y)==SEMI_2 || 
  278.       name(Y)==GOTO_1 || name(Y) <=NORMATOM ||
  279.       repchar(longstring(name(Y)))=='$') 
  280.       return true; 
  281.   TRACE_GOON=0;
  282.   /* Don't trace evaluable predicates unless debugging interpreter. */
  283.      if(!(spyflag=spy(name(Y))) && !TRACING)return true;
  284.  
  285.   oldinfile=FNAME(inputfile);
  286.   inputfile=OpenFile(phy_name(STDTRACE_0),read_mode);
  287.   oldoutfile=FNAME(outputfile);
  288.   outputfile=OpenFile(phy_name(STDTRACE_0),write_mode);
  289.      ws(spyflag ? "*" : " ");
  290.      ws("("); wi((int)E); ws(")"); 
  291.      switch(MESS)
  292.      { case CALL_0:    ws("\tCALL: "); break;
  293.        case REDO_0:    ws("\tREDO: "); break;
  294.        case PROVED_0:  ws("\tEXIT: "); break;
  295.        case FAILED_0:  ws("\tFAIL: "); break;
  296.      }
  297.      QUOTE=true; DISPLFLAG=false; LISTFLAG=false; VARCNT=0; 
  298.      WRITETERM(Y,MAXPREC,20); 
  299.      QUOTE=false;
  300.      if( 1 /*MESS==CALL_0 || MESS==REDO_0*/)
  301.      {
  302.         mesg:
  303.            ws("   [sanft?\\n] "); 
  304.        nextch:
  305.   if(FILEENDED()) goto ret;
  306.          GETCHAR();
  307.   if(!mustread && (CH != '\n'))goto nextch;
  308.          switch(CH)
  309.          { 
  310.     case 's': case 'S':   TRACE_GOON=E; 
  311.                          mustread=false;
  312.                          goto nextch;
  313.     case 'a': case 'A':   TRACE_GOON=0;ABORT(ABORTE); 
  314.     case 'f': case 'F':  answer=false; 
  315.                          mustread=false;
  316.                          TRACE_GOON=0;
  317.                          goto nextch;
  318.     case 'n': case 'N':  TRACING=false;
  319.                          SPYTRACE=SPYING;
  320.                          TRACE_GOON=0;
  321.                          mustread=false;
  322.                          goto nextch;
  323.     case 't': case 'T':  TRACING=true;
  324.                          SPYTRACE=true;
  325.                          mustread=false;
  326.                          goto nextch;
  327.     case '0': case '1': case '2': case '3': case '4':
  328.     case '5': case '6': case '7': case '8': case '9':
  329.                          if(!newgo)TRACE_GOON=CH-'0';
  330.                          else
  331.                            TRACE_GOON=10*TRACE_GOON + CH-'0';
  332.                          if(TRACE_GOON >E)
  333.                           { TRACE_GOON=0; mustread=false;}
  334.                          break;
  335.     case '?':
  336.                          ws(" [s]kip\n");
  337.                          ws(" [a]bort\n");
  338.                          ws(" [n]otrace\n");
  339.                          ws(" [f]ail\n");
  340.                          ws(" [t]race\n");
  341.                          ws(" [\\n]  next");
  342.                          mustread=false;again=true;
  343.                          goto mesg;
  344.     case '\n':           if(!again) goto ret;            
  345.                          again=false;
  346.                          mustread=true;/* no break */
  347.     default:             goto nextch;
  348.          }
  349.      }
  350.      else ws("\n");
  351.     ret:
  352.     inputfile=OpenFile(oldinfile,read_mode);
  353.     outputfile=OpenFile(oldoutfile,write_mode);
  354.     return answer;
  355. }
  356.  
  357. GLOBAL void wq(ATOM A)
  358. {/* quoted output if necessary */
  359.     int nIDENT=0,aIDENT=0;
  360.     int notfirst=0;
  361.     string s,ss;
  362.     ss=s=tempcopy(A);
  363.     if(QUOTE==false) goto noquote; 
  364.     do {
  365.         switch(CHARCLASS[*s])
  366.         {
  367.             case BC:
  368.             case DC: if(!notfirst)goto quote;
  369.             case SC: ++nIDENT; break;
  370.             case OC: ++aIDENT;break;
  371.             default: goto quote;
  372.         }
  373.         s++;notfirst++;
  374.     }while(*s);
  375.   if(nIDENT &&  aIDENT) goto quote;
  376.  noquote:
  377.      ws(ss);
  378.      return;
  379.  quote: ws("\'");
  380.         while(*ss)
  381.         {
  382.             if(*ss== '\t') ws("\\t");
  383.             else if(*ss== '\n') ws("\\n");
  384.             else if(*ss== '\007') ws("\\a");
  385.             else if(*ss== '\r') ws("\\r");
  386.             else if(*ss== '\b') ws("\\b");
  387.             else if(*ss== '\f') ws("\\f");
  388.             else if(*ss== '\v') ws("\\v");
  389.             else if(*ss== '\\') ws("\\\\");
  390.             else if(*ss== '\'') ws("\'\'");
  391.             else if(*ss < ' ' || *ss > '~') 
  392.                 { ws("\\");
  393.                   wc((int)(((unsigned int)(*ss & 0300)) >> 6) + '0');
  394.                   wc((int)(((unsigned int)(*ss & 0070)) >> 3) + '0');
  395.                   wc((int)((unsigned int)(*ss & 0007)) + '0');
  396.                 }
  397.             else wc(*ss);
  398.             ss++;
  399.         }
  400.         ws("\'");
  401.         return;
  402. }
  403.  
  404.  
  405.